package com.sixbro.authorization.security.domain;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Getter;
import lombok.Setter;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.SpringSecurityCoreVersion;
import org.springframework.security.core.userdetails.User;

import java.util.Collection;

/**
 * <p>
 *  扩展用户信息
 * </p>
 *
 * @author: Mr.Lu
 * @since: 2021/6/15 11:24
 */
public class OAuth2UserDetails extends User {

    private static final long serialVersionUID = SpringSecurityCoreVersion.SERIAL_VERSION_UID;

    /**
     * 用户ID
     */
    @Getter
    private Long id;

    /**
     * 手机号
     */
    @Getter
    @Setter
    private String mobile;

    /**
     * 租户ID
     */
    @Getter
    private String tenantId;

    /**
     *
     * @param id                    用户ID
     * @param mobile                手机号
     * @param tenantId              租户ID
     * @param username              the username presented to the <code>DaoAuthenticationProvider</code>
     * @param password              the password that should be presented to the <code>DaoAuthenticationProvider</code>
     * @param authorities           the authorities that should be granted to the caller if they presented the correct username and password and the user is enabled. Not null.
     *
     * @throws IllegalArgumentException if a <code>null</code> value was passed either as a parameter or as an element in the <code>GrantedAuthority</code> collection
     */
    @JsonCreator
    public OAuth2UserDetails(
            @JsonProperty("id") Long id,
            @JsonProperty("mobile") String mobile,
            @JsonProperty("tenantId") String tenantId,
            @JsonProperty("username") String username,
            @JsonProperty("password") String password,
            @JsonProperty("authorities") Collection<? extends GrantedAuthority> authorities
    ) {
        super(username, password, authorities);
        this.id = id;
        this.mobile = mobile;
        this.tenantId = tenantId;
    }

    /**
     *
     * @param id                    用户ID
     * @param mobile                手机号
     * @param tenantId              租户ID
     * @param username              the username presented to the <code>DaoAuthenticationProvider</code>
     * @param password              the password that should be presented to the <code>DaoAuthenticationProvider</code>
     * @param enabled               set to <code>true</code> if the user is enabled
     * @param accountNonExpired     set to <code>true</code> if the account has not expired
     * @param credentialsNonExpired set to <code>true</code> if the credentials have not expired
     * @param accountNonLocked      set to <code>true</code> if the account is not locked
     * @param authorities           the authorities that should be granted to the caller if they presented the correct username and password and the user is enabled. Not null.
     *
     * @throws IllegalArgumentException if a <code>null</code> value was passed either as a parameter or as an element in the <code>GrantedAuthority</code> collection
     */
    @JsonCreator
    public OAuth2UserDetails(
            @JsonProperty("id") Long id,
            @JsonProperty("mobile") String mobile,
            @JsonProperty("tenantId") String tenantId,
            @JsonProperty("username") String username,
            @JsonProperty("password") String password,
            @JsonProperty("enabled") boolean enabled,
            @JsonProperty("accountNonExpired") boolean accountNonExpired,
            @JsonProperty("credentialsNonExpired") boolean credentialsNonExpired,
            @JsonProperty("accountNonLocked") boolean accountNonLocked,
            @JsonProperty("authorities") Collection<? extends GrantedAuthority> authorities
    ) {
        super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
        this.id = id;
        this.mobile = mobile;
        this.tenantId = tenantId;
    }
}
